home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / PowerMacOberon 1.2 / Source / Elems / OpenElems.Mod (.txt) < prev    next >
Oberon Text  |  1995-08-22  |  7KB  |  198 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10b.Scn.Fnt
  3. Syntax10i.Scn.Fnt
  4. InfoElems
  5. Alloc
  6. Syntax10.Scn.Fnt
  7. StampElems
  8. Alloc
  9. 30 May 95
  10. "Title": OpenElems
  11. "Author": Christoph Steindl (CS)
  12. "Abstract": OpenElems perform a generic open command on the selected item. Depending on the suffix of the
  13.     entry different commands are called. The items are collected automatically from the current directory.
  14. "Keywords": Opening files
  15. "Version": 1.0
  16. "From":  22.05.95 15:39:15
  17. "Until": 
  18. "Changes": no changes
  19. "Hints": You can insert new suffix mappings by calling OpenElems.Add suffix command, can also be used to override
  20.     the default mapping, i.e. OpenElems.Add Text MyEdit.Open will cause *.Text files to be opened with MyEdit.
  21. TableElems
  22. Alloc
  23. Syntax10.Scn.Fnt
  24. /table
  25. Suffix    Command
  26. Text    Edit.Open
  27. Kep    Kelper.Open
  28. Dlg    Dialog.Open
  29. Hex    Hex.Open
  30. Draw    Draw.Open
  31. Film    Kelper.Open
  32. Cod    Edit.Open
  33. Tool    System.Open
  34. Mod    Edit.Open
  35. html    HTMLEdit.Open
  36. MODULE OpenElems;    (** CS 
  37. Standard mapping of suffices to commands:
  38. IMPORT Viewers, Texts, TextFrames, Oberon, PopupElems, Directories, Display, In;
  39.     OpenElem* = POINTER TO OpenElemDesc;
  40.     OpenElemDesc* = RECORD (PopupElems.ElemDesc)
  41.     END;
  42.     AutoDirElem* = POINTER TO AutoDirElemDesc;
  43.     AutoDirElemDesc* = RECORD (OpenElemDesc)
  44.     END;
  45.     Str64 = ARRAY 64 OF CHAR;
  46.     Entry = POINTER TO EntryDesc;
  47.     EntryDesc = RECORD
  48.         suffix: ARRAY 10 OF CHAR;
  49.         cmd: Str64;
  50.         next: Entry
  51.     END;
  52.     w: Texts.Writer;
  53.     map: Entry;
  54.     cnt: INTEGER;
  55. PROCEDURE ReadName (t: Texts.Text; pos: LONGINT; VAR name: ARRAY OF CHAR);
  56.     VAR r: Texts.Reader; ch: CHAR; i: INTEGER;
  57. BEGIN
  58.     Texts.OpenReader(r, t, pos); Texts.Read(r, ch); i := 0;
  59.     IF ch = '"' THEN Texts.Read(r, ch);
  60.         WHILE ~r.eot & (ch # '"') DO name[i] := ch; INC(i); Texts.Read(r, ch) END
  61.     ELSE
  62.         WHILE ~r.eot & (ch > " ") DO name[i] := ch; INC(i); Texts.Read(r, ch) END
  63.     END;
  64.     name[i] := 0X
  65. END ReadName;
  66. PROCEDURE GetSuffix(VAR str, suffix: ARRAY OF CHAR);
  67.     VAR i, j: INTEGER;
  68. BEGIN
  69.     i := 0; WHILE str[i] # 0X DO INC(i) END;
  70.     WHILE (i >= 0) & (str[i] # ".") DO DEC(i) END;
  71.     INC(i); j := 0;
  72.     WHILE str[i] # 0X DO suffix[j] := str[i]; INC(i); INC(j) END;
  73.     suffix[j] := 0X
  74. END GetSuffix;
  75. PROCEDURE Lookup(VAR suffix, cmd: ARRAY OF CHAR);
  76.     VAR e: Entry;
  77. BEGIN
  78.     e := map;
  79.     WHILE (e # NIL) & (e.suffix # suffix) DO e := e.next END;
  80.     IF e # NIL THEN
  81.         COPY(e.cmd, cmd);
  82.     ELSE
  83.         COPY("Edit.Open", cmd)
  84. END Lookup;
  85. PROCEDURE Exec (e: OpenElem; f: Display.Frame; pos: LONGINT);
  86.     VAR m: TextFrames.UpdateMsg; res: INTEGER; name: ARRAY 256 OF CHAR; suffix: ARRAY 10 OF CHAR;
  87.         par: Oberon.ParList; cmd: ARRAY 64 OF CHAR;
  88. BEGIN
  89.     ReadName(e.menu, pos, name);
  90.     GetSuffix(name, suffix);
  91.     Lookup(suffix, cmd);
  92.     NEW(par);
  93.     par.frame := f;
  94.     par.text := e.menu; par.pos := pos;
  95.     Oberon.Call(cmd, par, FALSE, res);
  96.     IF res = 0 THEN
  97.         m.id := TextFrames.replace; m.text := Texts.ElemBase(e); m.beg := Texts.ElemPos(e); m.end := m.beg + 1;
  98.         Viewers.Broadcast(m)
  99.     ELSE Texts.WriteString(w, " -- failed"); Texts.WriteLn(w); Texts.Append(Oberon.Log, w.buf)
  100. END Exec;
  101. PROCEDURE Handle* (e: Texts.Elem; VAR m: Texts.ElemMsg);
  102.     VAR e1: OpenElem;
  103. BEGIN
  104.     WITH e: OpenElem DO
  105.         WITH
  106.             m: Texts.CopyMsg DO
  107.                 IF m.e = NIL THEN NEW (e1); m.e := e1 END;
  108.                 PopupElems.Handle(e, m)
  109.         |  m: Texts.IdentifyMsg DO
  110.                 m.mod := "OpenElems"; m.proc := "Alloc"
  111.         |  m: PopupElems.ExecMsg DO Exec(e, m.frame, m.pos)
  112.         ELSE PopupElems.Handle(e, m)
  113.         END
  114. END Handle;
  115. PROCEDURE Alloc*;
  116.     VAR e: OpenElem;
  117. BEGIN
  118.     NEW(e); e.handle := Handle; Texts.new := e
  119. END Alloc;
  120. PROCEDURE Insert*;
  121.     VAR e: OpenElem; insert: TextFrames.InsertElemMsg; s: Texts.Scanner;
  122. BEGIN
  123.     NEW(e); e.handle := Handle; e.small := TRUE; 
  124.     Texts.OpenScanner(s, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(s);
  125.     IF ~(s.class IN {Texts.Name, Texts.String}) THEN s.s := "OpenElem" END;
  126.     COPY(s.s, e.name);
  127.     e.menu := TextFrames.Text(""); PopupElems.MeasureMenu(e);
  128.     insert.e := e; Viewers.Broadcast(insert)
  129. END Insert;
  130. PROCEDURE AddEntry (suffix, cmd: Str64);
  131.     VAR e: Entry;
  132. BEGIN
  133.     NEW(e);
  134.     COPY(suffix, e.suffix); COPY(cmd, e.cmd);
  135.     IF (e.suffix # "") & (e.cmd # "") THEN
  136.         e.next := map; map := e
  137. END AddEntry;
  138. PROCEDURE Add*; (* suffix command *)
  139.     VAR suffix, cmd: Str64;
  140. BEGIN
  141.     In.Open; In.Name(suffix); In.Name(cmd);
  142.     AddEntry(suffix, cmd)
  143. END Add;
  144. PROCEDURE ListProc (VAR name: ARRAY OF CHAR; time, date, length: LONGINT; isDir: BOOLEAN; VAR continue: BOOLEAN);
  145. BEGIN Texts.WriteString (w, name); Texts.WriteLn (w); INC(cnt)
  146. END ListProc;
  147. PROCEDURE CollectFiles (e: OpenElem);
  148. VAR volName: ARRAY 32 OF CHAR; vRefNum: INTEGER; dirID: LONGINT;
  149. BEGIN
  150.     e.menu := TextFrames.Text("");
  151.     Directories.GetCurDir (volName, vRefNum, dirID);
  152.     cnt := 0;
  153.     Directories.EnumerateFiles (vRefNum, dirID, e.name, ListProc);
  154.     IF cnt = 1 THEN Texts.WriteLn(w) END; (* prohibit AutoDirElems that do not pop up because they only contain one item *)
  155.     IF w.buf.len = 0 THEN Texts.WriteString (w, "no files found"); Texts.WriteLn (w); Texts.WriteLn (w) END;
  156.     Texts.Append(e.menu, w.buf); PopupElems.MeasureMenu(e)
  157. END CollectFiles;
  158. PROCEDURE HandleAutoDir* (e: Texts.Elem; VAR m: Texts.ElemMsg);
  159.     VAR e1: AutoDirElem;
  160. BEGIN
  161.     WITH e: AutoDirElem DO
  162.         WITH m: Texts.CopyMsg DO
  163.                 IF m.e = NIL THEN NEW (e1); m.e := e1 END;
  164.                 Handle(e, m)
  165.         |  m: Texts.IdentifyMsg DO
  166.                 m.mod := "OpenElems"; m.proc := "AllocAutoDir"
  167.         |  m: TextFrames.TrackMsg DO
  168.                 IF 1 IN m.keys THEN CollectFiles (e); Handle (e, m) END
  169.         ELSE Handle(e, m)
  170.         END
  171. END HandleAutoDir;
  172. PROCEDURE AllocAutoDir*;
  173.     VAR e: AutoDirElem;
  174. BEGIN
  175.     NEW(e); e.handle := HandleAutoDir; Texts.new := e
  176. END AllocAutoDir;
  177. PROCEDURE InsertAutoDir*;
  178.     VAR e: AutoDirElem; insert: TextFrames.InsertElemMsg;
  179. BEGIN
  180.     NEW(e); e.handle := HandleAutoDir; e.small := TRUE; e.name := "*";
  181.     e.menu := TextFrames.Text(""); PopupElems.MeasureMenu(e);
  182.     insert.e := e; Viewers.Broadcast(insert)
  183. END InsertAutoDir;
  184. BEGIN
  185.     Texts.OpenWriter(w);
  186.     AddEntry("Text", "Edit.Open");
  187.     AddEntry("Kep", "Kepler.Open");
  188.     AddEntry("Dlg", "Dialog.Open");
  189.     AddEntry("Hex", "Hex.Open");
  190.     AddEntry("Draw", "Draw.Open");
  191.     AddEntry("Film", "Kepler.Open");
  192.     AddEntry("Cod", "Edit.Open");
  193.     AddEntry("Tool", "System.Open");
  194.     AddEntry("Mod", "Edit.Open");
  195.     AddEntry("html", "HTMLEdit.Open")
  196. END OpenElems.Insert 
  197. OpenElems.InsertAutoDir
  198.